/*******************************************************************************
 * @Description: 数码管驱动程序
 * # 驱动芯片 74HC595
 * @FilePath: \Seven_Segment_LED_Display\User\Src\led_display.c
 * @Author: 信念D力量
 * @Date: 2021-04-17 22:30:25
 * @Github: https://www.github.com/fy2008
 * @Gitee: https://gitee.com/zsf90
 * @website: https://fy2008.github.io
 * @LastEditTime: 2021-04-18 19:05:30
 * @LastEditors: Please set LastEditors
 * @Copyright(C): 信念D力量 (freerealmshn@163.com)
 * @All Rights Reserved.
 ******************************************************************************/
// SDIO -> MOSI(PA10)
// SCLK -> SCLK(PB0)
// LOAD -> PA9
// GND -> GND
// VCC -> 5V
#include "led_display.h"

// 数码管编码
// 0 1 2 3 4 5 6 7 8 9 .
uint8_t data_num[] = {
    0xc0, // 0
    0xf9, // 1
    0xa4, // 2
    0xb0, // 3
    0x99, // 4
    0x92, // 5
    0x82, // 6
    0xf8, // 7
    0x80, // 8
    0x90, // 9
    0x7f // .
};

// 数码管字符编码
uint8_t data_str[] = {
    0x88, // A
    0x83, // B
    0xc6, // C
    0xa1, // D
    0x86, // E
    0x8e, // F
    0x00, // 全亮
    0xff  // 全灭
};

void led_display_seg(uint32_t num)
{
    uint32_t ge = num % 10;
    uint32_t shi = num / 10 % 10;
    uint32_t bai = num / 100 % 10;
    uint32_t qian = num / 1000;

    for (uint8_t i = 0; i < 4; i++)
    {
        // 如果 num 小于1000, 千位灭
        // 如果 num 小于100，千位和百位灭
        // 如果 num 小于10，千位，百位和十位灭
        switch (i)
        {
        case GE:
            HAL_SPI_Transmit(&hspi5, &data_num[ge], 1, 100);
            break;
        case SHI:
            if(num < 10)
            HAL_SPI_Transmit(&hspi5, &data_str[ALL_OFF], 1, 100);
            else
            HAL_SPI_Transmit(&hspi5, &data_num[shi], 1, 100);
            break;
        case BAI:
            if(num < 100)
            HAL_SPI_Transmit(&hspi5, &data_str[ALL_OFF], 1, 100);
            else
            HAL_SPI_Transmit(&hspi5, &data_num[bai], 1, 100);
            break;
        case QIAN:
            if(num < 1000)
            HAL_SPI_Transmit(&hspi5, &data_str[ALL_OFF], 1, 100);
            else
            HAL_SPI_Transmit(&hspi5, &data_num[qian], 1, 100);
            break;
        default:
            break;
        }
    }

    HAL_GPIO_WritePin(LED_LOAD_GPIO_Port, LED_LOAD_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(LED_LOAD_GPIO_Port, LED_LOAD_Pin, GPIO_PIN_RESET);
}
